Introduction
Police shootings has been in the nightly news for as long as TV has existed, yet each new shooting brings everyone to shilling realizations. This study aims to shed some light on such dark themes and equip people with the facts.
This data is a list of fatal police shootings from 2015 as recorded by the Washington Post that details the deaths of United States citizens at the hands of police officers. It includes information of the names of the citizens, the manner of death, if the citizen was armed, age, gender, city, and date.
Due to the personal nature of loss, the research team omitted the names of the deceased out of respect.
R Configuration
Below we display our sessionInfo() for replication purposes.
sessionInfo(package=NULL)
R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12.3
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] grid stats graphics grDevices utils datasets methods base
other attached packages:
[1] plyr_1.8.4 leaflet_1.1.0 hexbin_1.27.1 plotly_4.5.6 DT_0.2 readr_1.1.0 data.world_0.1.2
[8] dplyr_0.5.0 ggplot2_2.2.1 shinydashboard_0.5.3 shiny_1.0.0
loaded via a namespace (and not attached):
[1] Rcpp_0.12.10 base64enc_0.1-3 tools_3.3.2 digest_0.6.11 evaluate_0.10 lubridate_1.6.0 jsonlite_1.3 tibble_1.3.0
[9] gtable_0.2.0 viridisLite_0.2.0 lattice_0.20-34 DBI_0.5-1 crosstalk_1.0.0 curl_2.3 yaml_2.1.14 knitr_1.15.1
[17] stringr_1.1.0 httr_1.2.1 htmlwidgets_0.8 hms_0.3 rprojroot_1.2 R6_2.2.0 rmarkdown_1.3 purrr_0.2.2
[25] tidyr_0.6.1 magrittr_1.5 backports_1.0.5 scales_0.4.1 htmltools_0.3.5 rsconnect_0.7 assertthat_0.1 mime_0.5
[33] xtable_1.8-2 colorspace_1.3-2 httpuv_1.3.3 labeling_0.3 stringi_1.1.2 lazyeval_0.2.0 munsell_0.4.3
Obtaining The Data Set
The data set was originally found on data.world, uploaded by a user named carlvlewis who claims that the data set is updated daily. For the purpose of this study we used the latest verison of the data that was available.
The data that was originally obtained was raw and contained private information regarding real people, so the data was cleaned using the lapply and gsub functions. The team removed the names of the deceased and made the race variable clearer. This cleaned data set was upload to the project data set on data.world.
To obtain a copy of this data follow the following steps.
- Copy and paste the following link into your prefered web browser: https://data.world/robin-stewart/s-17-dv-final-project
- At the top-right section of your screen is a blue download button, that when clicked will download a zip file of the data set.
- Alternatively, scroll down to see a sample of the csv dataset. Click on the download button located to the right of the Explore button to download a csv file of the data set.
The following is a summary of the cleaned data set:
head(fatalPoliceShootings)
Census Data
The U.S. Census Bureau and data.world have recently anounced a partnership which has resulted in data.world being host of the Census Bureau’s biggest annual household survey, the American Community Suvery.
Through the official US Census Buearu data.world profile, census data will be offered for any person to use and analyze: https://data.world/uscensusbureau
We used a 2011-2015 Income of US Population Estimates data for this particular study. This dataset was found here: https://data.world/uscensusbureau/acs-2015-5-e-income
Using the data.world R package, the 2011-2015 Income of US Population dataset and the Fatal Police Shootings were queried and pulled into RStudio and combined using dplyr.
Here is a summary of the combined dataset:
head(incomeOfTheFatallyShot)
The columns of GINI, Per_Capita_Income, Median_Family_Income, and Median_Non_Family_Income were added from the census data and matched on state of the individual shot. This dataset was saved as a CSV for later use in Tablaeu and R Markdown.
ETL Data Cleaning
require(readr)
require(plyr)
file_path = "../01 Data/fatal-police-shootings-data.csv"
df <- read.csv(file_path, header=TRUE, stringsAsFactors=FALSE)
df$name <- NULL
names(df)
str(df)
measures <- c("id", "age")
dimensions <- setdiff(names(df), measures)
dimensions
for(n in names(df)) {
df[n] <- data.frame(lapply(df[n], gsub, pattern="[^ -~]",replacement= ""))
}
df["state"] <- data.frame(lapply(df["state"], toupper))
df$race <- gsub("W", "WHITE", df$race)
df$race <- gsub("^[H]", "HISPANIC", df$race)
df$race <- gsub("^[B]", "BLACK", df$race)
df$race <- gsub("^[N]", "NATIVE AMERICAN", df$race)
df$race <- gsub("^[A]", "ASIAN", df$race)
df$race <- gsub("^[O]", "OTHER", df$race)
df["race"]
df$gender <- gsub("F", "FEMALE", df$gender)
df$gender <- gsub("^[M]", "MALE", df$gender)
df["gender"]
head(df)
na2emptyString <- function (x) {
x[is.na(x)] <- ""
return(x)
}
if(length(dimensions) > 0) {
for(d in dimensions) {
# Change NA to the empty string.
df[d] <- data.frame(lapply(df[d], na2emptyString))
# Get rid of " and ' in dimensions.
df[d] <- data.frame(lapply(df[d], gsub, pattern="[\"']",replacement= ""))
# Change & to and in dimensions.
df[d] <- data.frame(lapply(df[d], gsub, pattern="&",replacement= " and "))
# Change : to ; in dimensions.
df[d] <- data.frame(lapply(df[d], gsub, pattern=":",replacement= ";"))
}
}
na2zero <- function (x) {
x[is.na(x)] <- 0
return(x)
}
if( length(measures) > 1) {
for(m in measures) {
print(m)
df[m] <- data.frame(lapply(df[m], gsub, pattern="[^--.0-9]",replacement= ""))
df[m] <- data.frame(lapply(df[m], na2zero))
df[m] <- data.frame(lapply(df[m], function(x) as.numeric(as.character(x))))
}
}
str(df)
write.csv(df, gsub("-data", "-cleaned", file_path), row.names=FALSE, na = "")
To create interesting visualizations, we must first understand what the combined data means. The columns that were queried from data.world were GINI, Per_Capita_Income, Median_Family_Income, and Median_Non_Family_Income. These are state-level summaries, meaning that each fatal shootings has per capita income, median family income, median non-family income information based on the state in which the shooting took place. Although this mixes individualized data with general data, it sheds some light into the type of environment and socioeconomic context the shooting took place.
Non-Aggregated Measures Analysis
plot(boxplot)

Aggregated Measures Analysis
plot(histogram)

Scatter Plots

plot(scatterplot)

Cross Tabs
plot(capitaRangePlot)

This is a graph of gender of the individual shot against if that individual showed signs of mental illness. Each quadrant is separated into 3 numbers that correspond to low/medium/high per capita income, respectively.
This graph shows the race of the individual shot against the individual’s gender. Each cell has the median income colored by race. A set was created by filtering those individuals that were shot in a state who median family income was between 46,000 and 62,000.
plot(genderRacePlot)

This graph shows the race of the individual shot against the individual’s gender. A set was created by using the dplyr filter function to separate those individuals that were shot in a state who’s state had a median family income was between 46,000 and 62,000.
This is a graph of gender of the individual shot vs if that individual showed signs of mental illness. The graph was then colored based on whether that particular individual was shot in area which had high/medium/low per capita income.
plot(raceFleePlot)

This R visualization was created using the calculated fields of Median(MedianFamilyIncome/PerCapitaIncome) and plotting based on how the individual fled against the race of the individual shot.
Bar Charts
The Median Income of Race Broken up by Gender is shown above. This combines both our data set and the census data set through the variables of race, gender and Median Income respectively. Mutliple rows are used used to break down the race into genders for each field. A calculated table parameter is used specifically the avg_median_income - window_avg_income. This parameter is the color in addition to the text and helps show that the males have relatively high numbers for this parameter even though they may have relatively low avg_median_income on it’s own compared to the females.
plot(incomeByRacePlot)

The Median Income of Race Broken up by Gender is shown above, specifically the R version. This combines both our data set and the census data set through the variables of race, gender and Median Income respectively. A facet is used to break down the race into genders for each field. A calculated table parameter is used specifically the avg_median_income - window_avg_income. This parameter text helps show that the males have relatively high numbers for this parameter even though they may have relatively low avg_median_income on it’s own compared to the females. The numbers are slightly different due to limits on the SQL statement so the process does not take to long to pull the data.
plot(inequalityPlot)
This barchart shows the GINI inequality index of the area criminals are from, using ID-sets to separate high income criminals.
LS0tCnRpdGxlOiAnPGNlbnRlcj48Yj5GYXRhbCBQb2xpY2UgU2hvb3RpbmdzIFNpbmNlIDIwMTU6IE5vdyB3aXRoIENlbnN1cyBEYXRhISA8L2I+PC9jZW50ZXI+JwphdXRob3I6ICI8Y2VudGVyPjxiPkNhcmxvcyBMb3lhLCBUb2xhbiBOZ3V5ZW4sIFJvYmluIFN0ZXdhcnQ8L2I+PC9jZW50ZXI+IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CnNlc3Npb25JbmZvKCkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSkKYGBgCgojKipJbnRyb2R1Y3Rpb24qKgoKUG9saWNlIHNob290aW5ncyBoYXMgYmVlbiBpbiB0aGUgbmlnaHRseSBuZXdzIGZvciBhcyBsb25nIGFzIFRWIGhhcyBleGlzdGVkLCB5ZXQgZWFjaCBuZXcgc2hvb3RpbmcgYnJpbmdzIGV2ZXJ5b25lIHRvIHNoaWxsaW5nIHJlYWxpemF0aW9ucy4gVGhpcyBzdHVkeSBhaW1zIHRvIHNoZWQgc29tZSBsaWdodCBvbiBzdWNoIGRhcmsgdGhlbWVzIGFuZCBlcXVpcCBwZW9wbGUgd2l0aCB0aGUgZmFjdHMuIAoKVGhpcyBkYXRhIGlzIGEgbGlzdCBvZiBmYXRhbCBwb2xpY2Ugc2hvb3RpbmdzIGZyb20gMjAxNSBhcyByZWNvcmRlZCBieSB0aGUgV2FzaGluZ3RvbiBQb3N0IHRoYXQgZGV0YWlscyB0aGUgZGVhdGhzIG9mIFVuaXRlZCBTdGF0ZXMgY2l0aXplbnMgYXQgdGhlIGhhbmRzIG9mIHBvbGljZSBvZmZpY2Vycy4gSXQgaW5jbHVkZXMgaW5mb3JtYXRpb24gb2YgdGhlIG5hbWVzIG9mIHRoZSBjaXRpemVucywgdGhlIG1hbm5lciBvZiBkZWF0aCwgaWYgdGhlIGNpdGl6ZW4gd2FzIGFybWVkLCBhZ2UsIGdlbmRlciwgY2l0eSwgYW5kIGRhdGUuCgpEdWUgdG8gdGhlIHBlcnNvbmFsIG5hdHVyZSBvZiBsb3NzLCB0aGUgcmVzZWFyY2ggdGVhbSBvbWl0dGVkIHRoZSBuYW1lcyBvZiB0aGUgZGVjZWFzZWQgb3V0IG9mIHJlc3BlY3QuICAKCiMqKlIgQ29uZmlndXJhdGlvbioqCkJlbG93IHdlIGRpc3BsYXkgb3VyIHNlc3Npb25JbmZvKCkgZm9yIHJlcGxpY2F0aW9uIHB1cnBvc2VzLgoKYGBge3Igc2Vzc2lvbkluZm99CnNlc3Npb25JbmZvKHBhY2thZ2U9TlVMTCkKYGBgCgpgYGB7cixpbmNsdWRlPUZBTFNFfQogIHNvdXJjZSgnLi4vMDEgRGF0YS9maW5hbHBsb3RzLlInKQpgYGAKIyoqT2J0YWluaW5nIFRoZSBEYXRhIFNldCoqCgpUaGUgZGF0YSBzZXQgd2FzIG9yaWdpbmFsbHkgZm91bmQgb24gZGF0YS53b3JsZCwgdXBsb2FkZWQgYnkgYSB1c2VyIG5hbWVkIGNhcmx2bGV3aXMgd2hvIGNsYWltcyB0aGF0IHRoZSBkYXRhIHNldCBpcyB1cGRhdGVkIGRhaWx5LiBGb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHVkeSB3ZSB1c2VkIHRoZSBsYXRlc3QgdmVyaXNvbiBvZiB0aGUgZGF0YSB0aGF0IHdhcyBhdmFpbGFibGUuCgpUaGUgZGF0YSB0aGF0IHdhcyBvcmlnaW5hbGx5IG9idGFpbmVkIHdhcyByYXcgYW5kIGNvbnRhaW5lZCBwcml2YXRlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyByZWFsIHBlb3BsZSwgc28gdGhlIGRhdGEgd2FzIGNsZWFuZWQgdXNpbmcgdGhlIGxhcHBseSBhbmQgZ3N1YiBmdW5jdGlvbnMuIFRoZSB0ZWFtIHJlbW92ZWQgdGhlIG5hbWVzIG9mIHRoZSBkZWNlYXNlZCBhbmQgbWFkZSB0aGUgcmFjZSB2YXJpYWJsZSBjbGVhcmVyLiBUaGlzIGNsZWFuZWQgZGF0YSBzZXQgd2FzIHVwbG9hZCB0byB0aGUgcHJvamVjdCBkYXRhIHNldCBvbiBkYXRhLndvcmxkLgoKVG8gb2J0YWluIGEgY29weSBvZiB0aGlzIGRhdGEgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHMuCgoxLiBDb3B5IGFuZCBwYXN0ZSB0aGUgZm9sbG93aW5nIGxpbmsgaW50byB5b3VyIHByZWZlcmVkIHdlYiBicm93c2VyOiBodHRwczovL2RhdGEud29ybGQvcm9iaW4tc3Rld2FydC9zLTE3LWR2LWZpbmFsLXByb2plY3QKICAgIGkuIEF0IHRoZSB0b3AtcmlnaHQgc2VjdGlvbiBvZiB5b3VyIHNjcmVlbiBpcyBhIGJsdWUgZG93bmxvYWQgYnV0dG9uLCB0aGF0IHdoZW4gY2xpY2tlZCB3aWxsIGRvd25sb2FkIGEgemlwIGZpbGUgb2YgdGhlIGRhdGEgc2V0LgogICAgaWkuIEFsdGVybmF0aXZlbHksIHNjcm9sbCBkb3duIHRvIHNlZSBhIHNhbXBsZSBvZiB0aGUgY3N2IGRhdGFzZXQuIENsaWNrIG9uIHRoZSBkb3dubG9hZCBidXR0b24gbG9jYXRlZCB0byB0aGUgcmlnaHQgb2YgdGhlIEV4cGxvcmUgYnV0dG9uIHRvIGRvd25sb2FkIGEgY3N2IGZpbGUgb2YgdGhlIGRhdGEgc2V0LgoKClRoZSBmb2xsb3dpbmcgaXMgYSBzdW1tYXJ5IG9mIHRoZSBjbGVhbmVkIGRhdGEgc2V0OgoKYGBge3J9CiAgc3VtbWFyeShmYXRhbFBvbGljZVNob290aW5ncykKYGBgICAKCiMqKkNlbnN1cyBEYXRhKioKClRoZSBVLlMuIENlbnN1cyBCdXJlYXUgYW5kIGRhdGEud29ybGQgaGF2ZSByZWNlbnRseSBhbm91bmNlZCBhIHBhcnRuZXJzaGlwIHdoaWNoIGhhcyByZXN1bHRlZCBpbiBkYXRhLndvcmxkIGJlaW5nIGhvc3Qgb2YgdGhlIENlbnN1cyBCdXJlYXUncyBiaWdnZXN0IGFubnVhbCBob3VzZWhvbGQgc3VydmV5LCB0aGUgQW1lcmljYW4gQ29tbXVuaXR5IFN1dmVyeS4KClRocm91Z2ggdGhlIG9mZmljaWFsIFVTIENlbnN1cyBCdWVhcnUgZGF0YS53b3JsZCBwcm9maWxlLCBjZW5zdXMgZGF0YSB3aWxsIGJlIG9mZmVyZWQgZm9yIGFueSBwZXJzb24gdG8gdXNlIGFuZCBhbmFseXplOiBodHRwczovL2RhdGEud29ybGQvdXNjZW5zdXNidXJlYXUKCldlIHVzZWQgYSAyMDExLTIwMTUgSW5jb21lIG9mIFVTIFBvcHVsYXRpb24gRXN0aW1hdGVzIGRhdGEgZm9yIHRoaXMgcGFydGljdWxhciBzdHVkeS4gVGhpcyBkYXRhc2V0IHdhcyBmb3VuZCBoZXJlOiBodHRwczovL2RhdGEud29ybGQvdXNjZW5zdXNidXJlYXUvYWNzLTIwMTUtNS1lLWluY29tZQoKVXNpbmcgdGhlIGRhdGEud29ybGQgUiBwYWNrYWdlLCB0aGUgMjAxMS0yMDE1IEluY29tZSBvZiBVUyBQb3B1bGF0aW9uIGRhdGFzZXQgYW5kIHRoZSBGYXRhbCBQb2xpY2UgU2hvb3RpbmdzIHdlcmUgcXVlcmllZCBhbmQgcHVsbGVkIGludG8gUlN0dWRpbyBhbmQgY29tYmluZWQgdXNpbmcgZHBseXIuIAoKSGVyZSBpcyBhIHN1bW1hcnkgb2YgdGhlIGNvbWJpbmVkIGRhdGFzZXQ6CgpgYGB7cn0Kc3VtbWFyeShpbmNvbWVPZlRoZUZhdGFsbHlTaG90KQpgYGAgIAoKVGhlIGNvbHVtbnMgb2YgR0lOSSwgUGVyX0NhcGl0YV9JbmNvbWUsIE1lZGlhbl9GYW1pbHlfSW5jb21lLCBhbmQgTWVkaWFuX05vbl9GYW1pbHlfSW5jb21lIHdlcmUgYWRkZWQgZnJvbSB0aGUgY2Vuc3VzIGRhdGEgYW5kIG1hdGNoZWQgb24gc3RhdGUgb2YgdGhlIGluZGl2aWR1YWwgc2hvdC4gVGhpcyBkYXRhc2V0IHdhcyBzYXZlZCBhcyBhIENTViBmb3IgbGF0ZXIgdXNlIGluIFRhYmxhZXUgYW5kIFIgTWFya2Rvd24uCgoKCgojKipFVEwgRGF0YSBDbGVhbmluZyoqCmBgYHtyLCBjb2RlID0gcmVhZExpbmVzKCIuLi8wMSBEYXRhL0VUTERhdGFDbGVhblVwLlIiKSwgZXZhbD1GQUxTRX0KYGBgCgoKCgoKCgpUbyBjcmVhdGUgaW50ZXJlc3RpbmcgdmlzdWFsaXphdGlvbnMsIHdlIG11c3QgZmlyc3QgdW5kZXJzdGFuZCB3aGF0IHRoZSBjb21iaW5lZCBkYXRhIG1lYW5zLiBUaGUgY29sdW1ucyB0aGF0IHdlcmUgcXVlcmllZCBmcm9tIGRhdGEud29ybGQgd2VyZSBHSU5JLCBQZXJfQ2FwaXRhX0luY29tZSwgTWVkaWFuX0ZhbWlseV9JbmNvbWUsIGFuZCBNZWRpYW5fTm9uX0ZhbWlseV9JbmNvbWUuIFRoZXNlIGFyZSBzdGF0ZS1sZXZlbCBzdW1tYXJpZXMsIG1lYW5pbmcgdGhhdCBlYWNoIGZhdGFsIHNob290aW5ncyBoYXMgcGVyIGNhcGl0YSBpbmNvbWUsIG1lZGlhbiBmYW1pbHkgaW5jb21lLCBtZWRpYW4gbm9uLWZhbWlseSBpbmNvbWUgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIHN0YXRlIGluIHdoaWNoIHRoZSBzaG9vdGluZyB0b29rIHBsYWNlLiBBbHRob3VnaCB0aGlzIG1peGVzIGluZGl2aWR1YWxpemVkIGRhdGEgd2l0aCBnZW5lcmFsIGRhdGEsIGl0IHNoZWRzIHNvbWUgbGlnaHQgaW50byB0aGUgdHlwZSBvZiBlbnZpcm9ubWVudCBhbmQgc29jaW9lY29ub21pYyBjb250ZXh0IHRoZSBzaG9vdGluZyB0b29rIHBsYWNlLgoKCgoKCiMqKk5vbi1BZ2dyZWdhdGVkIE1lYXN1cmVzIEFuYWx5c2lzKioKCiFbQm94IFBsb3RdKC4uLzAzIFZpc3VhbGl6YXRpb25zL0JveHBsb3QucG5nKQoKYGBge3J9CiAgcGxvdChib3hwbG90KQpgYGAgIAoKCgoKCgoKCgoKIyoqQWdncmVnYXRlZCBNZWFzdXJlcyBBbmFseXNpcyoqCgohW0hpc3RvZ3JhbV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvSGlzdG9ncmFtLnBuZykKCiFbSGlzdG9ncmFtXSguLi8wMyBWaXN1YWxpemF0aW9ucy9IaXN0b2dyYW0gLSBBY3Rpb24ucG5nKQoKYGBge3J9CiAgcGxvdChoaXN0b2dyYW0pCmBgYCAgCgoKCgoKCgoKCgoKIyoqU2NhdHRlciBQbG90cyoqCgohW01hcF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvTWFwLnBuZykKCiFbU2NhdHRlciBQbG90XSguLi8wMyBWaXN1YWxpemF0aW9ucy9TY2F0dGVyIFBsb3QucG5nKQohW1NjYXR0ZXIgUGxvdF0oLi4vMDMgVmlzdWFsaXphdGlvbnMvU2NhdHRlciBQbG90IC0gQWN0aW9uLnBuZykKCiFbRGFzaGJvYXJkXSguLi8wMyBWaXN1YWxpemF0aW9ucy9EYXNoYm9hcmQucG5nKQoKIVtEYXNoYm9hcmRdKC4uLzAzIFZpc3VhbGl6YXRpb25zL1RyZW5kIE1vZGVsLnBuZykKCgpgYGB7cn0KICBwbG90KHNjYXR0ZXJwbG90KQpgYGAgIAoKCgoKCgoKIyoqQ3Jvc3MgVGFicyoqCgohW0tQSV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvS1BJLnBuZykKCmBgYHtyfQogIHBsb3QoY2FwaXRhUmFuZ2VQbG90KQpgYGAgIApUaGlzIGlzIGEgZ3JhcGggb2YgZ2VuZGVyIG9mIHRoZSBpbmRpdmlkdWFsIHNob3QgYWdhaW5zdCBpZiB0aGF0IGluZGl2aWR1YWwgc2hvd2VkIHNpZ25zIG9mIG1lbnRhbCBpbGxuZXNzLiBFYWNoIHF1YWRyYW50IGlzIHNlcGFyYXRlZCBpbnRvIDMgbnVtYmVycyB0aGF0IGNvcnJlc3BvbmQgdG8gbG93L21lZGl1bS9oaWdoIHBlciBjYXBpdGEgaW5jb21lLCByZXNwZWN0aXZlbHkuCgoKCiFbU2V0XSguLi8wMyBWaXN1YWxpemF0aW9ucy9Dcm9zc3RhYiBhbmQgU2V0LnBuZykKVGhpcyBncmFwaCBzaG93cyB0aGUgcmFjZSBvZiB0aGUgaW5kaXZpZHVhbCBzaG90IGFnYWluc3QgdGhlIGluZGl2aWR1YWwncyBnZW5kZXIuIEVhY2ggY2VsbCBoYXMgdGhlIG1lZGlhbiBpbmNvbWUgY29sb3JlZCBieSByYWNlLiBBIHNldCB3YXMgY3JlYXRlZCBieSBmaWx0ZXJpbmcgdGhvc2UgaW5kaXZpZHVhbHMgdGhhdCB3ZXJlIHNob3QgaW4gYSBzdGF0ZSB3aG8gbWVkaWFuIGZhbWlseSBpbmNvbWUgd2FzIGJldHdlZW4gNDYsMDAwIGFuZCA2MiwwMDAuIAoKCgpgYGB7cn0KICBwbG90KGdlbmRlclJhY2VQbG90KQpgYGAKVGhpcyBncmFwaCBzaG93cyB0aGUgcmFjZSBvZiB0aGUgaW5kaXZpZHVhbCBzaG90IGFnYWluc3QgdGhlIGluZGl2aWR1YWwncyBnZW5kZXIuIEEgc2V0IHdhcyBjcmVhdGVkIGJ5IHVzaW5nIHRoZSBkcGx5ciBmaWx0ZXIgZnVuY3Rpb24gdG8gc2VwYXJhdGUgdGhvc2UgaW5kaXZpZHVhbHMgdGhhdCB3ZXJlIHNob3QgaW4gYSBzdGF0ZSB3aG8ncyBzdGF0ZSBoYWQgYSBtZWRpYW4gZmFtaWx5IGluY29tZSB3YXMgYmV0d2VlbiA0NiwwMDAgYW5kIDYyLDAwMC4gCgoKCiFbUGFyYW1ldGVyXSguLi8wMyBWaXN1YWxpemF0aW9ucy9QYXJhbWV0ZXIucG5nKQpUaGlzIGlzIGEgZ3JhcGggb2YgZ2VuZGVyIG9mIHRoZSBpbmRpdmlkdWFsIHNob3QgdnMgaWYgdGhhdCBpbmRpdmlkdWFsIHNob3dlZCBzaWducyBvZiBtZW50YWwgaWxsbmVzcy4gVGhlIGdyYXBoIHdhcyB0aGVuIGNvbG9yZWQgYmFzZWQgb24gd2hldGhlciB0aGF0IHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXMgc2hvdCBpbiBhcmVhIHdoaWNoIGhhZCBoaWdoL21lZGl1bS9sb3cgcGVyIGNhcGl0YSBpbmNvbWUuIAoKYGBge3J9CiAgcGxvdChyYWNlRmxlZVBsb3QpCmBgYApUaGlzIFIgdmlzdWFsaXphdGlvbiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgY2FsY3VsYXRlZCBmaWVsZHMgb2YgTWVkaWFuKE1lZGlhbkZhbWlseUluY29tZS9QZXJDYXBpdGFJbmNvbWUpIGFuZCBwbG90dGluZyBiYXNlZCBvbiBob3cgdGhlIGluZGl2aWR1YWwgZmxlZCBhZ2FpbnN0IHRoZSByYWNlIG9mIHRoZSBpbmRpdmlkdWFsIHNob3QuIAoKCgoKCgoKCgojKipCYXIgQ2hhcnRzKioKCiFbVGFibGUgQ2FsY3VsYXRpb25zXSguLi8wMyBWaXN1YWxpemF0aW9ucy9CYXJjaGFydCBhbmQgVGFibGUgQ2FsY3VsYXRpb24ucG5nKQpUaGUgTWVkaWFuIEluY29tZSBvZiBSYWNlIEJyb2tlbiB1cCBieSBHZW5kZXIgaXMgc2hvd24gYWJvdmUuIFRoaXMgY29tYmluZXMgYm90aCBvdXIgZGF0YSBzZXQgYW5kIHRoZSBjZW5zdXMgZGF0YSBzZXQgdGhyb3VnaCB0aGUgdmFyaWFibGVzIG9mIHJhY2UsIGdlbmRlciBhbmQgTWVkaWFuIEluY29tZSByZXNwZWN0aXZlbHkuIE11dGxpcGxlIHJvd3MgYXJlIHVzZWQgdXNlZCB0byBicmVhayBkb3duIHRoZSByYWNlIGludG8gZ2VuZGVycyBmb3IgZWFjaCBmaWVsZC4gQSBjYWxjdWxhdGVkIHRhYmxlIHBhcmFtZXRlciBpcyB1c2VkIHNwZWNpZmljYWxseSB0aGUgYXZnX21lZGlhbl9pbmNvbWUgLSB3aW5kb3dfYXZnX2luY29tZS4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbG9yIGluIGFkZGl0aW9uIHRvIHRoZSB0ZXh0IGFuZCBoZWxwcyBzaG93IHRoYXQgdGhlIG1hbGVzIGhhdmUgcmVsYXRpdmVseSBoaWdoIG51bWJlcnMgZm9yIHRoaXMgcGFyYW1ldGVyIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGhhdmUgcmVsYXRpdmVseSBsb3cgYXZnX21lZGlhbl9pbmNvbWUgb24gaXQncyBvd24gY29tcGFyZWQgdG8gdGhlIGZlbWFsZXMuIAoKCmBgYHtyfQogIHBsb3QoaW5jb21lQnlSYWNlUGxvdCkKYGBgCgpUaGUgTWVkaWFuIEluY29tZSBvZiBSYWNlIEJyb2tlbiB1cCBieSBHZW5kZXIgaXMgc2hvd24gYWJvdmUsIHNwZWNpZmljYWxseSB0aGUgUiB2ZXJzaW9uLiBUaGlzIGNvbWJpbmVzIGJvdGggb3VyIGRhdGEgc2V0IGFuZCB0aGUgY2Vuc3VzIGRhdGEgc2V0IHRocm91Z2ggdGhlIHZhcmlhYmxlcyBvZiByYWNlLCBnZW5kZXIgYW5kIE1lZGlhbiBJbmNvbWUgcmVzcGVjdGl2ZWx5LiBBIGZhY2V0IGlzIHVzZWQgdG8gYnJlYWsgZG93biB0aGUgcmFjZSBpbnRvIGdlbmRlcnMgZm9yIGVhY2ggZmllbGQuIEEgY2FsY3VsYXRlZCB0YWJsZSBwYXJhbWV0ZXIgaXMgdXNlZCBzcGVjaWZpY2FsbHkgdGhlIGF2Z19tZWRpYW5faW5jb21lIC0gd2luZG93X2F2Z19pbmNvbWUuIFRoaXMgcGFyYW1ldGVyIHRleHQgaGVscHMgc2hvdyB0aGF0IHRoZSBtYWxlcyBoYXZlIHJlbGF0aXZlbHkgaGlnaCBudW1iZXJzIGZvciB0aGlzIHBhcmFtZXRlciBldmVuIHRob3VnaCB0aGV5IG1heSBoYXZlIHJlbGF0aXZlbHkgbG93IGF2Z19tZWRpYW5faW5jb21lIG9uIGl0J3Mgb3duIGNvbXBhcmVkIHRvIHRoZSBmZW1hbGVzLiBUaGUgbnVtYmVycyBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50IGR1ZSB0byBsaW1pdHMgb24gdGhlIFNRTCBzdGF0ZW1lbnQgc28gdGhlIHByb2Nlc3MgZG9lcyBub3QgdGFrZSB0byBsb25nIHRvIHB1bGwgdGhlIGRhdGEuIAoKCgoKIVtJRCBTZXRzXSguLi8wMyBWaXN1YWxpemF0aW9ucy9JRCBTZXRzLnBuZykKCmBgYHtyfQogIHBsb3QoaW5lcXVhbGl0eVBsb3QpCmBgYAoKVGhpcyBiYXJjaGFydCBzaG93cyB0aGUgR0lOSSBpbmVxdWFsaXR5IGluZGV4IG9mIHRoZSBhcmVhIGNyaW1pbmFscyBhcmUgZnJvbSwgdXNpbmcgSUQtc2V0cyB0byBzZXBhcmF0ZSBoaWdoIGluY29tZSBjcmltaW5hbHMuCgoKCiMqKlIgU2hpbnkqKgpBbGwgUiB2aXN1YWxpemF0aW9ucyB3ZXJlIGdyYXBoZWQgb24gY3Jvc3N0YWJzIGluIFIgU2hpbnkuIEVhY2ggZ3JhcGggaW4gZWFjaCBvZiB0aGUgZGlmZmVyZW50IHRhYnMuCkhlcmUgaXMgYSBsaW5rIHRvIHRoZSBwdWJsaXNoZWQgc2hpbnkgYXBwbGljYXRpb246IGh0dHBzOi8vcm9iaW4tc3Rld2FydC5zaGlueWFwcHMuaW8vZmluYWxfcHJvamVjdC8KCiFbT25saW5lIFNoaW55IEFwcGxpY2F0aW9uXSguLi8wMyBWaXN1YWxpemF0aW9ucy9zaGlueU9ubGluZUFwcC5wbmcpCg==